// 类
// 修饰符
// 父类 ｜ 基类
export class Father {
  // 私有属性： 只允许自己访问
  private money: number = 10000;
  // 保护属性： 只允许自己访问以及子类访问
  protected readonly code: number;

  constructor(code: number) {
    this.code = code;
  }

  // 公共属性： 大家都可以访问
  public sayMoney() {
    console.log("我有money" + this.money);
  }
}

// 类 接口
interface SonState {
  name: string;
  age: number
}

// 子类 ｜ 派生类
export class Son extends Father implements SonState {
  // 实例属性
  public name: string;
  public age: number;
  // 构造器
  public constructor(name: string, age: number, code: number) {
    super(code);
    console.log("构造器执行了！！！");
    this.name = name;
    this.age = age;
  }
  // 原型方法
  public sayName() {
    console.log(`我是${this.name}, 今年${this.age}岁了`);
  }

  // 静态属性
  static qwe = 123;
  // 静态方法
  static sayName() {
    console.log("我是静态方法");
  }
}

const s1 = new Son("张三", 12, 123456789);



// 抽象类
abstract class Animal {
  // 抽象属性
  abstract name: string
  abstract age: number
  // 抽象方法
  abstract eat(): void
  abstract run(): void
}

class Dog extends Animal {
  name: string = '狗'
  age: number;
  constructor(age: number) {
    super()
    this.age = age
  }
  eat(): void {
    console.log('大口大口吃')
  }
  run(): void {
    console.log('四角朝地奔跑')
  }
}


class Cat extends Animal {
  name: string = '猫'
  age: number;
  constructor(age: number) {
    super()
    this.age = age
  }
  eat(): void {
    console.log('小口小口吃')
  }
  run(): void {
    console.log('蹦蹦跳跳奔跑')
  }
}